HTTP(Hyper Text Transfer Protocol)
✒️ 2025-06-02 09:06 내용 수정
참고 자료 : CloudFare HTTP란 무엇입니까, mdn web docs HTTP, 위키백과 HTTP, wikipedia HTTP
HTTP(Hyper Text Transfer Protocol)
네트워크 장치 간에 정보를 전송하도록 설계된 응용 계층 프로토콜
- 사용자가 쉽게 접근할 수 있는 자원들의 하이퍼링크를 포함한 하이퍼 텍스트 문서다.
- TCP와 UDP를 사용하며 프로토콜의 포트 번호는 80번이다.
- TCP/IP 모델의 응용 계층에서 설계된 프로토콜이며, 이 설계는 신뢰할 수 있는 전송 계층 프로토콜에 기반하여 작동하도록 정의되어 있다.
- HTTP의 보안 버전으로 HTTPS가 있다.
무상태 프로토콜(Stateless Protocol)
- HTTP는 상태를 유지하지 않는 무상태(stateless) 프로토콜이므로, 각각의 요청은 독립적으로 처리된다.
- 통신이 독립적인 쌍의 요청과 응답을 이룰 수 있게 한다.
- 이전 요청과의 관계를 유지하기 위해 쿠키나 세션 등의 방법을 사용한다.
- Stateless와 Stateful Protocol 참고.
HTTP의 자원
- HTTP 자원은
http와httpsscheme을 사용한 URL(Uniform Resource Locator)로 식별되고 위치가 저장된다.- URI(Uniform Resource Identifiers)는 인터넷 자원을 고유하게 식별하는 문자로, URL은 URI에 속한다.
HTTP 기반 시스템 구성 요소

클라이언트 - 서버 구조
- 웹에서 이루어지는 모든 데이터 교환의 기초로 클라이언트-서버 모델 프로토콜이기도 하다.
- 일반적으론 클라이언트 시스템에서 서버에 요청(request)을 보내고, 서버가 응답(response) 메시지를 보내는 작업이 포함된다.
- 클라이언트 역할인 웹 브라우저는 최종 사용자와 웹 컨텐츠의 상호작용을 관리하는 user agent(UA)이다.
- 검색 엔진 인덱스를 채우고 유지하는 봇(bot) 역시 사용자 에이전트다.
프록시(Proxy)
- 웹 브라우저(클라이언트)와 웹 서버 사이에 있는 컴퓨터나 다른 장치들 중 응용 계층에서 동작하는 장치들이다.
- 캐싱, 필터링, 로드 밸런싱, 인증, 로깅 기능을 수행한다.
HTTP를 통한 데이터 교환 과정
- HTTP를 통한 서버와 클라이언트의 데이터 교환은 세션 계층 전송 연결을 통해 요청-응답 메시지 과정으로 이루어진다.
- TCP의 3-Way Handshake와 4-Way Handshake 과정을 통해 이루어진다.
- HTTP 클라이언트가 서버에 연결을 시도한다.
- HTTP/HTTPS 서버는 연결을 받아들이는 포트를 통해 클라이언트의 요청 메시지를 기다린다.
- 클라이언트가 HTTP 요청 메시지를 서버로 전송한다.
- 서버는 메시지를 받은 후 응답 header와 (필요 시)body를 포함한 HTTP 응답 메시지를 클라이언트에 전송한다.
- 클라이언트가 메시지를 받은 후 클라이언트와 서버의 연결이 종료된다.
HTTP 메시지 구조
- HTTP는 HTTP Header와 HTTP Body로 이루어져 있다.
- request와 response 모두 헤더(header)와 바디(body)를 가지고 있다.
1. Request Message

- 요청 라인 : HTTP 메서드, 요청 대상 URL, HTTP 버전
- Header : 요청에 대한 부가 정보 포함
- 빈 줄(CRLF) : Header와 Body를 구분하는 역할
- Body : 선택 사항이며
POST나PUT요청 때 작성할 데이터를 담는 부분
2. Response Message

- 상태 라인 : HTTP 버전, 응답 상태 코드, 상태 메시지
- Header : 응답에 대한 부가 정보 포함
- 빈 줄(CRLF) : Header와 Body를 구분하는 역할
- Body : 클라이언트가 요청한 데이터
HTTP Header와 HTTP Body
1. HTTP Header
- 요청과 응답에 대한 메타데이터를 담고 있다.
- 클라이언트의 요청이나 서버의 응답으로 부가적인 정보를 전달할 수 있도록 해준다.
- 키 값 쌍에 저장된 텍스트 정보가 포함되어 있다.
- 헤더 중에는 요청과 응답에 모두 사용되는 헤더(엔티티 헤더)도 있으며, 요청이나 응답에만 사용하는 헤더도 있다.
| 헤더 종류 | 설명 |
|---|---|
| 일반 헤더(General Header) | request, response에 모두 적용 |
| body에서 최종적으로 전송되는 데이터와는 관련 없음 | |
| 요청 헤더(Request Header) | 패치될 resource나 클라이언트 자체에 대한 자세한 정보를 포함 |
| 응답 헤더(Response Header) | 서버 자체에 대한 정보 등과 같은 응답에 대한 부가적인 정보를 포함 |
| 엔티티 헤더(Entity Header) | 컨텐츠 길이, MIME 타입과 같은 엔티티 바디에 대한 정보 포함 |
1) 요청 헤더
| 카테고리 | 헤더 이름 | 설명 |
|---|---|---|
| 요청 컨텍스트 | Host |
요청 대상 서버의 도메인 이름과 포트 번호를 지정 |
User-Agent |
클라이언트의 소프트웨어 정보를 서버에 전달 | |
Referer |
현재 요청된 페이지의 이전 페이지 URL을 서버에 전달 | |
| 컨텐츠 협상 | Accept |
클라이언트가 처리 가능한 MIME 타입을 서버에 알림 |
Accept-Language |
클라이언트가 선호하는 언어를 서버에 알림 | |
Accept-Encoding |
클라이언트가 지원하는 콘텐츠 인코딩 방식을 서버에 알림 | |
| 인증 | Authorization |
인증 정보를 서버에 전달하여 접근을 요청 |
| 메시지 Body 정보 | Content-Type |
요청 본문의 MIME 타입을 지정 |
Content-Length |
요청 본문의 길이를 바이트 단위로 지정 | |
Content-Language |
사용자의 선호 언어 지정 | |
| 쿠키 | Cookie |
클라이언트가 저장한 쿠키를 서버에 전달 |
2) 응답 헤더
| 카테고리 | 헤더 이름 | 설명 |
|---|---|---|
| 응답 컨텍스트 | Allow |
리소스에 의해 지원되는 HTTP 요청 메서드 나열 |
Server |
응답을 생성한 서버의 소프트웨어 정보를 클라이언트에 전달 | |
| 쿠키 | Set-Cookie |
클라이언트에 쿠키를 설정하도록 지시 |
| 리다이렉트 | Location |
리디렉션 대상 URL을 클라이언트에 알림 |
| 인증 | WWW-Authenticate |
클라이언트에 인증을 요청 |
| 보안 | Strict-Transport-Security |
HTTPS 연결을 강제하도록 클라이언트에 지시 |
| CORS | Access-Control-Allow-Origin |
CORS 정책에 따라 접근을 허용할 출처를 지정 |
Access-control-Allow-Credentials |
Credentials 플래그가 true일 때 요청에 대한 응답 노출 지정 | |
| 기타 | Retry-After |
클라이언트가 다시 요청을 시도해야 하는 시간을 지정 |
- Response Header의 Content-Type : resource의 MIME 타입을 나타내기 위해 사용한다.
- 참고 자료 : mdn web docs HTTP Content-Type
- body 내의 데이터가 어떤 형식의 데이터인지 알려준다.
- MIME 타입에 세부적인 타입 참고
3) 표현 헤더
| 카테고리 | 헤더 이름 | 설명 |
|---|---|---|
| 메시지 바디 정보 | Content-Type |
응답 본문의 MIME 타입을 지정 |
Content-Encoding |
응답 본문의 인코딩 방식을 지정 | |
Content-Language |
응답 본문의 언어를 지정 | |
Content-Length |
응답 본문의 길이를 바이트 단위로 지정 | |
| 조건부 | ETag |
리소스의 고유 식별자를 제공하여 캐싱을 지원 |
Last-Modified |
리소스가 마지막으로 수정된 날짜와 시간을 지정 |
4) 페이로드 헤더
| 카테고리 | 헤더 이름 | 설명 |
|---|---|---|
| 전송 코딩 | Transfer-Encoding |
메시지 본문의 전송 인코딩 방식을 지정 |
Content-MD5 |
메시지 본문의 MD5 해시 값을 제공하여 무결성을 확인 | |
| 범위 요청 | Content-Range |
응답 본문의 일부 범위를 지정하여 부분 전송을 지원 |
2. HTTP Body
- 서버와 클라이언트간에 주고 받을 실제 데이터를 저장한 공간이다.
- request 본문에는 사용자 이름, 비밀번호, 기타 데이터 등과 같이 웹 서버에 제출되는 모든 정보가 포함된다.
- response 본문에는 클라이언트로부터 요청된 정보가 포함되어 있다.
HTTP 상태 코드
- 서버의 response 에 포함되어 있으며, 상태 코드를 통해 request의 성공과 실패 여부를 알 수 있다.
- 참고 자료 : mdn web docs HTTP Status

| 분류 | 코드 | 설명 |
|---|---|---|
| 1xx | 정보 응답 | |
100 |
Continue 지금까지의 상태가 괜찮음 계속 요청하거나 이미 요청을 완료하면 무시해도 됨을 알려줌 |
|
102 |
Processing 서버가 요청을 수신했고 처리중이지만, 아직 제대로 된 응답은 불가 |
|
| 2xx | 성공 응답 성공을 알리는 상태 코드 |
|
200 |
OK 요청이 성공적으로 수행됨 |
|
201 |
Created 요청이 성공적이며, 새로운 리소스가 생성됨 |
|
| 3xx | 리다이렉션 메시지 리다이렉션(다른 페이지로 이동)을 알리는 상태 코드 |
|
301 |
Moved Permanently 요청한 리소스의 URI가 변경됨 새로운 URI가 응답에서 주어질 수도 있음 |
|
302 |
Found 요청한 리소스의 URI가 일시적으로 변경됨 새로운 URI는 나중에 만들어질 수 있음 |
|
304 |
Not Modified 캐시 목적으로 사용됨 클라이언트에게 응답이 수정되지 않았음을 알려주고, 클라이언트는 응답의 캐시된 버전을 사용할 수 있음 |
|
| 4xx | 클라이언트 에러 응답 요청 요류를 알리는 상태 코드. 요청 자체에 오류가 있을 때 표시 |
|
400 |
Bad Request 잘못된 요청으로 서버가 요청을 이해할 수 없음 |
|
401 |
Unauthorized 권한 없음 표준에선 미승인(Unauthorized)지만 의미상 비인증(Unauthenticated) |
|
403 |
Forbidden 클라이언트는 컨텐츠에 접근 불가 서버가 클라이언트를 알고 있음 |
|
404 |
Not Found 서버가 요청 받은 리소스를 찾을 수 없음 브라우저에선 알려지지 않은 URL을 의미 인증 받지 않은 클라이언트로부터 리소스를 숨기기 위해 403 대신에 사용할 수도 있음 |
|
408 |
Request Time out 요청지연으로 인한 에러 |
|
409 |
Conflict 요청이 현재 서버의 상태와 충돌됨 |
|
414 |
URI Too Long 요청 URI가 서버에서 처리하지 않기로 한 길이보다 긺 |
|
415 |
Unsupported Media Type 요청한 미디어 포맷은 서버에서 지원하지 않기에 서버는 요청을 거절함 |
|
418 |
I'm a teapot 서버는 커피를 찻 주전자에 끓이는 것을 거절함 (만우절 때 추가된 코드) |
|
429 |
Too Many Request 지정된 시간에 요청을 너무 많이 전송함 |
|
| 5xx | 서버 에러 응답 서버 오류를 나타내는 상태 코드 요청은 제대로 왔으나 서버에 오류가 생겼을 때 표시 |
|
500 |
Internal Server Error 서버가 처리 방법을 모르는 상황이 발생함 |
|
502 |
Bad Gateway 서버가 요청을 처리하는데 필요한 응답을 얻기 위해 게이트웨이로 작업하는 동안 잘못된 응답을 수신함 (서버와 클라이언트 사이에 있는 Proxy나 LoadBalancer 서버가 자원 서버로부터 잘못된 응답을 받을 때) |
|
503 |
Service Unavailable 서버가 요청을 처리할 준비가 되지 않았음 서버의 작동 중단 및 과부하 시 발생 |
|
508 |
Loop Detected 서버가 요청을 처리하는 동안 무한 루프를 감지함 |
HTTP 요청 메서드
- 클라이언트가 서버에 데이터를 전송하여 응답을 얻을 때 사용하는 방식이다.
- 참고 자료 : mdn web docs HTTP 요청 메서드
| 메서드 | 설명 |
|---|---|
| GET | 서버의 자원을 가져올 때 사용 |
| HEAD | GET과 동일하나 응답 본문을 포함하지 않음 |
| POST | 서버에 자원을 등록할 때 사용 |
| PUT | 서버의 자원을 요청에 들어있는 자원으로 치환할 때 사용 |
| PATCH | 서버의 자원에서 일부 내용만 요청에 있는 자원으로 치환할 때 사용 |
| DELETE | 서버의 자원을 삭제할 때 사용 |
| OPTIONS | 요청 전 통신 옵션을 설정 |
1) GET
- 서버의 자원을 가져올 때 사용한다.
- 요청의 본문(body)에 데이터를 넣지 않는다.
- 데이터를 서버로 보내야 할 때는 query string을 사용한다.
- POST보다 속도가 빨라 조회 용도로 자주 사용한다.
2) POST
- 서버에 자원을 등록할 때 사용한다.
- 요청의 본문(body)에 새로 등록할 데이터를 넣어 전송한다.
- binary로 데이터를 전송하기에 이미지, 기타 파일을 주고 받을 때 사용한다.
3) PUT
- 서버의 자원을 요청에 들어있는 자원으로 치환할 때 사용한다.
- 수정 동작 시에 사용한다.
- 기존 데이터를 전부 새 내용으로 변경하며, 기존 데이터가 없으면 새로 생성한다.
- 요청의 본문(body)에 치환할 데이터를 넣어 전송한다.
4) PATCH
- 서버의 자원에서 일부 내용만 요청에 있는 자원으로 치환할 때 사용한다.
- 요청의 본문(body)에 치환할 데이터를 넣어 전송한다.
5) DELETE
- 서버의 자원을 삭제할 때 사용한다.
- 요청의 본문(body)에 데이터를 넣지 않는다.